/***************************************************
> Copyright (C) 2024 ==KINGYI== All rights reserved.
> File Name: send.c
> Author:cjy
> Mail: 
> Created Time: 2024年08月06日 星期二 22时26分11秒
***************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
typedef struct use_info{
	int key;
	char txt[100]; 
} USE;
struct msgbuf{
    long mtype;   // 消息类型
    char mtext[200]; 
};
int main(int argc,const char* argv[])
{
	char path[50] = {0};
	key_t key = 0; // 消息队列标识符
    	int msgid = 0; // 消息队列 ID
    	int ret = 0;
	printf("请输入路径:");
    	scanf("%s", path);
	
	key = ftok(path,1);
	if (key == -1) {
        perror("ftok");
        exit(-1);    
    	}

	msgid = msgget(key,IPC_CREAT | 0666);
	if (msgid == -1) {
        perror("msgget");
        exit(-1);    
    	}

// 发送
	USE use;
	use.key = key;
	scanf("%s",use.txt);
	struct msgbuf msg;
	msg.mtype = 1;
	memcpy(msg.mtext,&use,sizeof(USE));
	ret = msgsnd(msgid,&msg,sizeof(USE),0);
	if (ret == -1) {
            perror("msgsnd");
            exit(-1);
        }
	}
	// eof
	// 再单独发送完成标志
    struct msgbuf eofMsg;
    eofMsg.mtype = 1;
    memset(eofMsg.mtext, 0, sizeof(eofMsg.mtext));
    strcpy(eofMsg.mtext, "EOF");
    ret = msgsnd(msgid, &eofMsg, sizeof(eofMsg.mtext), 0);
    if (ret == -1) {
        perror("msgsnd");
        exit(-1);
    }

// 接收
	struct msgbuf data;
	memset(&data, 0, sizeof(struct msgbuf));
        ret = msgrcv(msgid, &data, sizeof(struct msgbuf) - sizeof(long), 2, 0);
        if (ret == -1) {
            perror("msgrcv");
            exit(-1);          // 遇到错误退出程序
        }
	if (strcmp(data.mtext, "EOF") == 0) {
            break;
        }

        USE k;
        memcpy(&k, data.mtext, sizeof(USE));
        printf("%d:\n", k.key);
        printf("%s\n", k.txt);
    return 0;
}
